#include "libMacros.h"

/*
 * Realiza uma busca na tabela de instruções pelo token informado.
 * Retorna o índice da matriz caso encontre a instrução cc retorna falso.
 */
int buscaInstrucao(char * token) {
    int i;
    for (i = 0; i < NUM_INSTRUCOES; i++) {
        if (!strcmp(token, TabInstrucoes[i].nome)) {
            return i;
        }
    }
    return FALSE;
}

/*
 * Inicializa a matriz de instruções com o minemônico e o código de cada instrução.
 * Adicionado a diretiva SPACE que serve para alocação de espaço em memória para uma variável.
 */
void inicializaTabInstrucoes() {

    strcpy(TabInstrucoes[0].nome, "ADD");
    TabInstrucoes[0].codigo = 2;
    TabInstrucoes[0].operandos = 1;

    strcpy(TabInstrucoes[1].nome, "BR");
    TabInstrucoes[1].codigo = 0;
    TabInstrucoes[1].operandos = 1;

    strcpy(TabInstrucoes[2].nome, "BRNEG");
    TabInstrucoes[2].codigo = 5;
    TabInstrucoes[2].operandos = 1;

    strcpy(TabInstrucoes[3].nome, "BRPOS");
    TabInstrucoes[3].codigo = 1;
    TabInstrucoes[3].operandos = 1;

    strcpy(TabInstrucoes[4].nome, "BRZERO");
    TabInstrucoes[4].codigo = 4;
    TabInstrucoes[4].operandos = 1;

    strcpy(TabInstrucoes[5].nome, "COPY");
    TabInstrucoes[5].codigo = 13;
    TabInstrucoes[5].operandos = 2;

    strcpy(TabInstrucoes[6].nome, "DIVIDE");
    TabInstrucoes[6].codigo = 10;
    TabInstrucoes[6].operandos = 1;

    strcpy(TabInstrucoes[7].nome, "LOAD");
    TabInstrucoes[7].codigo = 3;
    TabInstrucoes[7].operandos = 1;

    strcpy(TabInstrucoes[8].nome, "MULT");
    TabInstrucoes[8].codigo = 14;
    TabInstrucoes[8].operandos = 1;

    strcpy(TabInstrucoes[9].nome, "READ");
    TabInstrucoes[9].codigo = 12;
    TabInstrucoes[9].operandos = 1;

    strcpy(TabInstrucoes[10].nome, "STOP");
    TabInstrucoes[10].codigo = 11;
    TabInstrucoes[10].operandos = 0;

    strcpy(TabInstrucoes[11].nome, "STORE");
    TabInstrucoes[11].codigo = 7;
    TabInstrucoes[11].operandos = 1;

    strcpy(TabInstrucoes[12].nome, "SUB");
    TabInstrucoes[12].codigo = 6;
    TabInstrucoes[12].operandos = 1;

    strcpy(TabInstrucoes[13].nome, "WRITE");
    TabInstrucoes[13].codigo = 8;
    TabInstrucoes[13].operandos = 1;

    strcpy(TabInstrucoes[14].nome, "SPACE");
    TabInstrucoes[14].codigo = 9;
    TabInstrucoes[14].operandos = 0;

    strcpy(TabInstrucoes[15].nome, "ATRIB");
    TabInstrucoes[15].codigo = 80;
    TabInstrucoes[15].operandos = 1;

}

void trataCaminhoArquivo(char * caminhoArq) {

    int fim = strlen(caminhoArq);
    int iExtencao = 0, iBarra = -1, i = 0;
    char * pe, *pb;

    pe = strstr(caminhoArq, ".");
    if (pe != NULL)
        for (iExtencao = fim; caminhoArq[iExtencao] != '.'; --iExtencao);

    pb = strstr(caminhoArq, "/");
    if (pb != NULL)
        for (iBarra = fim; caminhoArq[iBarra] != '/' && iBarra > 0; --iBarra);

    for (fim = iBarra + 1; fim < iExtencao; fim++, i++) {
        nomeArquivo[i] = caminhoArq[fim];
    }
    if (pb != NULL) {
        for (i = 0; i <= iBarra; i++) {
            caminhoArquivo[i] = caminhoArq[i];
        }
    } else {
        strcpy(caminhoArquivo, "");
    }
}

